import Layout from '@/layout'
import {getHistoryMode} from "@/router/util.js";
import {createRouter} from "vue-router";
import NProgress from "@/utils/progress.js";
import {getToken} from "@/utils/token.js";
import {usePermissionStore} from "@/store/modules/permission.js";
import {isRelogin} from "@/utils/request.js";
import {isHttp} from "@/utils/validate.js";


// 公共路由
export const constantRoutes = [
    {
        path: '/redirect',
        component: Layout,
        hidden: true,
        children: [
            {
                path: '/redirect/:path(.*)',
                component: () => import('@/layout/redirect.vue')
            }
        ]
    },
    {
        path: '/login',
        component: () => import('@/views/Login.vue'),
        hidden: true
    },
    {
        path: '/register',
        component: () => import('@/views/Register.vue'),
        hidden: true
    },
    {
        path: "/:pathMatch(.*)*",
        component: () => import('@/views/error/404'),
        hidden: true
    },
    {
        path: '',
        component: Layout,
        redirect: '/index',
        children: [
            {
                path: '/index',
                component: () => import('@/views/index.vue'),
                name: 'Index',
                meta: { title: '首页', icon: 'vite', affix: true }
            }
        ]
    },
    {
        path: '/user',
        component: Layout,
        hidden: true,
        redirect: 'noredirect',
        children: [
            {
                path: 'profile',
                component: () => import('@/views/system/user/profile/index.vue'),
                name: 'Profile',
                meta: { title: '个人中心', icon: 'user' }
            }
        ]
    }
]

// 动态路由，基于用户权限动态去加载
export const dynamicRoutes = [
    {
        path: '/system/user-auth',
        component: Layout,
        hidden: true,
        permissions: ['system:user:edit'],
        children: [
            {
                path: 'role/:userId(\\d+)',
                component: () => import('@/views/system/user/authRole.vue'),
                name: 'AuthRole',
                meta: { title: '分配角色', activeMenu: '/system/user', icon: '' }
            }
        ]
    },
    {
        path: '/system/role-auth',
        component: Layout,
        hidden: true,
        permissions: ['system:role:edit'],
        children: [
            {
                path: 'user/:roleId(\\d+)',
                component: () => import('@/views/system/role/authUser.vue'),
                name: 'AuthUser',
                meta: { title: '分配用户', activeMenu: '/system/role', icon: '' }
            }
        ]
    },
    {
        path: '/system/dict-data',
        component: Layout,
        hidden: true,
        permissions: ['system:dict:list'],
        children: [
            {
                path: 'index/:dictId(\\d+)',
                component: () => import('@/views/system/dict/data.vue'),
                name: 'Data',
                meta: { title: '字典数据', activeMenu: '/system/dict', icon: '' }
            }
        ]
    },
    {
        path: '/system/oss-config',
        component: Layout,
        hidden: true,
        permissions: ['system:ossConfig:list'],
        children: [
            {
                path: 'index',
                component: () => import('@/views/system/oss/config.vue'),
                name: 'OssConfig',
                meta: { title: '配置管理', activeMenu: '/system/oss', icon: '' }
            }
        ]
    },
    {
        path: '/tool/gen-edit',
        component: Layout,
        hidden: true,
        permissions: ['tool:gen:edit'],
        children: [
            {
                path: 'index/:tableId(\\d+)',
                component: () => import('@/views/tool/gen/editTable.vue'),
                name: 'GenEdit',
                meta: { title: '修改生成配置', activeMenu: '/tool/gen', icon: '' }
            }
        ]
    },
    //{
    //    path: '/workflow/leaveEdit',
    //    component: Layout,
    //    hidden: true,
    //    permissions: ['workflow:leave:edit'],
    //    children: [
    //        {
    //            path: 'index',
    //            component: () => import('@/views/workflow/leave/leaveEdit.vue'),
    //            name: 'leaveEdit',
    //            meta: { title: '请假申请', activeMenu: '/workflow/leave', noCache: true }
    //        }
    //    ]
    //}
]


const router = createRouter({
    history: getHistoryMode(import.meta.env.VITE_ROUTER_HISTORY),
    routes: constantRoutes.concat(dynamicRoutes),
    scrollBehavior(to, from, savedPosition) {
        if (savedPosition) {
            return savedPosition
        } else {
            return { top: 0 }
        }
    },
});

const whitePages = ['/login', '/register']

router.beforeEach( (to, from, next) => {
    NProgress.start();
    
    // 已登录
    if (getToken()) {
        //动态网页标题?
        to?.meta?.title && useSettingsStore().setTitle(to.meta.title)
        //已登录的情况下到登录页的链接重定向到首页
        if (to.path === '/login') {
            next({path: '/'})
        }
        else {
            // 如果用户未请求user_info
            if (useUserStore().name === ''){
                isRelogin.show = true
                // 拉取用户信息
                useUserStore().getInfo()
                    .then(() => {
                        isRelogin.show = false
                        return usePermissionStore().generateRoutes()
                    })
                    //    动态添加用户路由
                    .then((routes) => {
                        routes.forEach((route) => {
                            if (!isHttp(route.path)){
                            router.addRoute(route)
                            }
                        })
                        next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
                    })
                    //    token 过期
                    .catch(err => {
                        console.error(err)
                        useUserStore().logOut().then(() => {
                            ElMessage.error(err)
                            next({path: '/'})
                        })
                    })
            }else {
                next()
            }
        }
    }
    //匿名访问 (没有登录)
    else {
        if (whitePages.includes(to.path)){
            next()
        }
        else {
            //重定向到登录页
            next(`/login?redirect=${to.fullPath}`)
        }
    }
    
} )

router.afterEach(() => NProgress.done())

export default router;
